#ifndef LECTEURSYMBOLE_H_
#define LECTEURSYMBOLE_H_

#include <fstream>
#include <string>
using namespace std;

#include "LecteurCaractere.h"
#include "Symbole.h"

/*! \file LecteurSymbole.h
    \brief La spécification de la classe LecteurSymbole
    
    Décrit la liste des méthodes et attributs associés à la classe LecteurSymbole
    \author lazzamar
    \date 16/12/2012
 */
/*! \class LecteurSymbole
    \brief La classe représentant le lecteur des symboles du langage.
    
    Cette classe permet de lire les symboles du langage. Les
    méthodes suivantes sont associées à l'accès:
    \li suivant
    \li getSymCour
    \li getLigne
    \li getColonne
    \li sauterSeparateurs
    \li sauterCommentaire
    \li motSuivant
 */

class LecteurSymbole {
public:
	/*! \fn LecteurSymbole(string nomFich);
		\brief Constructeur de la classe LecteurSymbole

	 Ce constructeur construit le lecteur de symbole en ouvrant le fichier (en
	 appelant le constructeur de lc) et ensuite met le premier symbole du
	 fichier dans symCour.
		\param string nomFich - le nom du fichier à ouvrir
	*/
	LecteurSymbole(string nomFich);    // résultat : symCour = premier symbole du fichier nomFich

	/*! \fn void suivant();
		\brief Passe au symbole suivant.

	 Cette fonction avance dans le fichier au symbole suivant.
	*/
	void suivant();                    // passe au symbole suivant du fichier
	
	/*! \fn Symbole getSymCour();
		\brief Accesseur du symbole courant.

	 Cette fonction renvoie le symbole courant.
		\return Le symbole courant symCour
	*/
	inline Symbole getSymCour()      { return symCour; } // accesseur
	
	/*! \fn unsigned int getLigne();
		\brief Accesseur de la ligne.

	 Cette fonction renvoie la valeur de la ligne du symbole courant.
		\return Le numéro entier de la ligne.
	*/
	inline unsigned int getLigne()   { return ligne;   } // accesseur
	
	/*! \fn unsigned int getColonne();
		\brief Accesseur de la colonne.

	 Cette fonction renvoie la valeur de la colonne du symbole courant.
		\return Le numéro entier de la colonne.
	*/
	inline unsigned int getColonne() { return colonne; } // accesseur

private:
	/*! \var LecteurCaractere lc
		\brief  Contient le lecteur de caractère.
	*/
	LecteurCaractere lc;			// le lecteur de caracteres
	
	/*! \var Stmbole symCour
		\brief  Contient le symbole courant du lecteur de symbole.
	*/
	Symbole symCour;				// le symbole courant du lecteur de symboles
	
	/*! \var unisgned int ligne
		\brief  Contient le numéro de la ligne du fichier.
	*/
	/*! \var unisgned int colonne
		\brief  Contient le numéro de la colonne du fichier.
	*/
	unsigned int ligne, colonne;	// coordonnees, dans le fichier, du symbole courant
	
	/*! \fn void sauterSeparateurs();
		\brief  Ignore les séparateurs.
	 
	 Saute dans lc une suite de séparateurs consécutifs.
	*/
	void sauterSeparateurs();		// saute dans lc une suite de separateurs consecutifs
	
	/*! \fn void sauterCommentaire();
		\brief  Ignore les commentaires.
	 
	 Saute dans lc une ligne de commentaire.
	*/
	void sauterCommentaire();		// saute dans lc une ligne de commentaires
	
	/*! \fn string motSuivant();
		\brief  Lit le prochain symbole.
	 
	 Lit dans lc la chaine du prochain symbole et la retourne.
	*/
	string motSuivant();			// lit dans lc la chaine du prochain symbole et la renvoie en resultat
};

#endif /* LECTEURSYMBOLE_H_ */ 
